#include "news_factory.h"

#include <curl/curl.h>
#include <iostream>
#include <exception>
#include <algorithm>

using namespace std;

int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
	int result = 0;
	if (buffer != NULL)
	{
		//добавляем к буферу строки из data, в количестве nmemb
		buffer->append(data, size * nmemb);
		//вычисляем объем принятых данных
		result = size * nmemb;
	}
	return result;
}

char easytolower(char in){
	if(in<='Z' && in>='A')
		return in-('Z'-'z');
	return in;
}

void NewsFactory::stripTags(string *body)
{
	string t_str(*body);
	body->clear();
	bool inside_tag = false;
	for (unsigned i=0; i<t_str.size(); ++i)
	{
		if (t_str[i] == '>')
		{
			inside_tag = true;
			continue;
		}
		else
		if (t_str[i] == '<')
		{
			inside_tag = false;
			continue;
		}	
		if (inside_tag) {
			body->push_back(t_str[i]);
		}
	}
}

NewsEntry* NewsFactory::getNewsEntry(const char *url)
{
	
	string *buffer = new string();
	
	CURL *curl; //–Њ–±—К–µ–Ї—В —В–Є–њ–∞ CURL 
	CURLcode result;
	curl = curl_easy_init(); //–Є–љ–Є—Ж–Є–∞–ї–Є–Ј–∞—Ж–Є—П
	if(!curl)
		throw(exception());
	
	curl_easy_setopt(curl, CURLOPT_URL, url);
	//хедер нам не нужен - только содержимое документа
	curl_easy_setopt(curl, CURLOPT_HEADER, 0);
	//указываем функцию обратного вызова для записи получаемых данных
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
	//указываем куда записывать принимаемые данные
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);

	result = curl_easy_perform(curl);
	if (result != CURLE_OK)      
		throw(exception());
	
	// приводим статью к такому виду, чтобы ее было легче анализировать
	//stripTags(buffer);
	string::iterator i;
	for (i=buffer->begin(); i!=buffer->end(); ++i)
	{
		if (*i==',' ||
			*i=='.' ||
			*i=='?' ||
			*i=='!') 
		{ *i = ' '; }
	}
	transform(buffer->begin(), buffer->end(), buffer->begin(), easytolower);
	
	return new NewsEntry(string(url), *buffer);
}
